﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NiconicoAPI;

namespace RateCounterAPI {
    /// <summary>
    /// 平均得点を集計するクラスです。
    /// </summary>
    public class AvgCounter {
        /// <summary>
        /// 集計状況が更新されたときに通知されるイベントです。
        /// </summary>
        public event EventHandler ProgressChanged;
        /// <summary>
        /// 集計が完了したときに通知されるイベントです。
        /// </summary>
        public event EventHandler CountCompleted;

        /// <summary>
        /// 放送情報を取得します。
        /// </summary>
        public Broadcast Broadcast { get; private set; }
        /// <summary>
        /// 集計条件を取得、設定します。
        /// </summary>
        public Condition Conditon { get; private set; }

        /// <summary>
        /// 点数を取得します。
        /// </summary>
        public double Score { get; private set; }

        /// <summary>停止フラグ</summary>
        private bool _isStop;
        /// <summary>キーロックオブジェクト</summary>
        private object _lockObj = new object();

        /// <summary>対象外コメントリスト</summary>
        private List<Comment> _nonCommentList = new List<Comment>();

        private List<Comment> _commentList = new List<Comment>();


        /// <param name="broadcast">放送オブジェクト</param>
        public AvgCounter(Broadcast broadcast, Condition condition) {
            Broadcast = broadcast;
            Conditon = condition;
        }

        /// <summary>
        /// コメントを解析し点数を抽出する。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void commentRecived(object sender, CommnetRecivedEventArgs e) {
            Point result = Point.Parse(e.Comment);
            //書式チェック
            if (!result.IsSuccess) {
                return;
            }
            //条件チェック;
            if (this.Conditon.Validate(result)) {
                _nonCommentList.Add(e.Comment);
                return;
            }

            _commentList.Add(e.Comment);

            OnProgressChanged();
        }

        private void OnProgressChanged() {
            //TODO:すれっどせーふじゃない！
            if (ProgressChanged != null) {
                ProgressChanged(this, EventArgs.Empty);
            }
        }
        
        /// <summary>
        /// 採点を開始します。
        /// </summary>
        public void Start() {
            lock (_lockObj) {
                if (!_isStop) {
                    throw new InvalidOperationException("既に開始されています。");
                }
                _isStop = false;
                Broadcast.StartComment(-1);
            }
        }

        /// <summary>
        /// 採点を終了します。
        /// </summary>
        public void Stop() {
            lock (_lockObj) {
                if (_isStop) {
                    throw new InvalidOperationException("集計は開始状態でありません。");
                }
                _isStop = true;
                Broadcast.StopComment();
            }
        }
    }
}
